package com.创建者模式.单例模式;

/**
 * 单例模式
 * * 定义：指一个类只有一个实例，且该类能自行创建这个实例的一种模式
 * * 特点： 1单例类只有一个实例对象；
 * *		2该单例对象必须由单例类自行创建；
 * *		3单例类对外提供一个访问该单例的全局访问点。
 * * 优点：单例模式可以保证内存里只有一个实例，减少了内存的开销。
 * *		可以避免对资源的多重占用。
 * *		单例模式设置全局访问点，可以优化和共享资源的访问。
 * * 缺点：
 * *       单例模式一般没有接口，扩展困难。如果要扩展，则除了修改原来的代码，没有第二种途径，违背开闭原则。
 * *	   在并发测试中，单例模式不利于代码调试。在调试过程中，如果单例中的代码没有执行完，也不能模拟生成一个新的对象。
 * *	   单例模式的功能代码通常写在一个类中，如果功能设计不合理，则很容易违背单一职责原则。
 * *应用场景：对于一些要平凡创建和销毁的对象，创建一个需要很多时间的对象，一个对象要被一个系统共享（唯一性比如jdbc链接）
 * *实现方式： 懒汉式 ，饿汉式。
 * *
 * *
 *
 * @author chenhs
 * @date 2020/10/10
 */
public class Singleton {
	private static volatile Singleton singleton = null;
	//防止类被外部实例化。
	private Singleton() {};
	//	获取实例 懒汉模式 当调用时才实例化对象
	//如果编写的是多线程程序，则不要删除上例代码中的关键字 volatile 和 synchronized，否则将存在线程非安全的问题。如果不删除这两个关键字就能保证线程安全
	//，但是每次访问时都要同步，会影响性能，且消耗更多的资源，这是懒汉式单例的缺点。
	public static  synchronized  Singleton getInstance(){
		if (singleton ==null){
			singleton =new Singleton();
		}
		return singleton;
	}
	//饿汉模式，类加载时就实例化对象
	//饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用，
	// 以后不再改变，所以是线程安全的，可以直接用于多线程而不会出现问题。
	private static volatile Singleton singleton2 = new Singleton();
	public static Singleton getgetInstance2(){
		return singleton2;
	}
	
}
